package com.pig4cloud.pig.mt.config;

import com.pig4cloud.pig.mt.handler.*;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.constant.WxMpEventConstants;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static me.chanjar.weixin.common.api.WxConsts.EventType;
import static me.chanjar.weixin.common.api.WxConsts.EventType.SCAN;
import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE;
import static me.chanjar.weixin.common.api.WxConsts.EventType.UNSUBSCRIBE;
import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType.EVENT;
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.KF_CLOSE_SESSION;
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.KF_CREATE_SESSION;
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.KF_SWITCH_SESSION;
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY;

@RequiredArgsConstructor
@Configuration
public class WxMpRouterConfiguration {
    private final LogHandler logHandler;
    private final NullHandler nullHandler;
    private final KfSessionHandler kfSessionHandler;
    private final MenuHandler menuHandler;
    private final MsgHandler msgHandler;
    private final ScanHandler scanHandler;
    private final UnsubscribeHandler unsubscribeHandler;
    private final SubscribeHandler subscribeHandler;

    private final StoreCheckNotifyHandler storeCheckNotifyHandler;
    private final LocationHandler locationHandler;


//    @Bean
//    public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
//        final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);
//
//        // 记录所有事件的日志 （异步执行）
//        newRouter.rule().handler(this.logHandler).next();
//
//        // 接收客服会话管理事件
//        newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION).handler(this.kfSessionHandler).end();
//        // 自定义菜单事件
//        newRouter.rule().async(false).msgType(EVENT).event(EventType.CLICK).handler(this.menuHandler).end();
//        // 关注事件
//        newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end();
//        // 取消关注事件
//        newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end();
//        //扫描带参二维码事件
//        newRouter.rule().async(false).msgType(EVENT).event(SCAN).handler(this.scanHandler).end();
//        //其他事件
//        newRouter.rule().async(false).msgType(EVENT).handler(this.nullHandler).end();
//
//        // 默认
//        newRouter.rule().async(false).handler(this.msgHandler).end();
//
//        return newRouter;
//    }

    @Bean
    public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
		final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);

		// 记录所有事件的日志 （异步执行）
		newRouter.rule().handler(logHandler).next();

		// 接收客服会话管理事件
		newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION).handler(kfSessionHandler).end();
		newRouter.rule().async(false).msgType(EVENT).event(KF_CLOSE_SESSION).handler(kfSessionHandler).end();
		newRouter.rule().async(false).msgType(EVENT).event(KF_SWITCH_SESSION).handler(kfSessionHandler).end();

		// 门店审核事件
		newRouter.rule().async(false).msgType(EVENT).event(POI_CHECK_NOTIFY).handler(storeCheckNotifyHandler).end();

		// 自定义菜单事件
		newRouter.rule().async(false).msgType(EVENT).event(EventType.CLICK).handler(menuHandler).end();

		// 点击菜单连接事件
		newRouter.rule().async(false).msgType(EVENT).event(EventType.VIEW).handler(nullHandler).end();

		// 关注事件
		newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(subscribeHandler).end();

		// 取消关注事件
		newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(unsubscribeHandler).end();

		// 上报地理位置事件
		newRouter.rule().async(false).msgType(EVENT).event(EventType.LOCATION).handler(locationHandler).end();

		// 接收地理位置消息
		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION).handler(locationHandler).end();

		// 扫码事件
		newRouter.rule().async(false).msgType(EVENT).event(EventType.SCAN).handler(scanHandler).end();

		// 默认
		newRouter.rule().async(false).handler(msgHandler).end();

		return newRouter;
	}
}
